# coding: utf-8
#
# Thanks to logilab for this code.
#
# Copied from the logilab.common.optik_ext module (GPL-licensed) and modified for woo.
#

import optparse,time

class ManHelpFormatter(optparse.HelpFormatter):
    """Format help using man pages ROFF format"""
    def __init__(self,indent_increment=0,max_help_position=24,width=79,short_first=0):
        optparse.HelpFormatter.__init__(self, indent_increment, max_help_position, width, short_first)
    def format_heading(self, heading):
        return '.SH %s\n' % heading.upper()
    def format_description(self, description):
        return description
    def format_option(self, option):
        try:
            optstring = option.option_strings
        except AttributeError:
            optstring = self.format_option_strings(option)
        if option.help:
            help = ' '.join([l.strip() for l in option.help.splitlines()])
        else:
            help = ''
        return '''.IP "%s"
%s
''' % (optstring, help)
    def format_head(self, optparser, metadata, section=1):
        pgm = optparser.get_prog_name()
        short_desc = self.format_short_description(pgm, metadata['short_desc'])
        long_desc = self.format_long_description(pgm, metadata['long_desc'])
        return '%s\n%s\n%s\n%s' % (self.format_title(pgm, section), short_desc, self.format_synopsis(optparser), long_desc)
    def format_title(self, pgm, section):
        date = '-'.join([str(num) for num in time.localtime()[:3]])
        return '.TH %s %s "%s" %s' % (pgm, section, date, pgm)
    def format_short_description(self, pgm, short_desc):
        return '''.SH NAME
.B %s 
\- %s
''' % (pgm, short_desc.strip())
    def _markup(self, txt):
        """Prepares txt to be used in man pages."""
        return txt.replace('-', '\\-')
    def format_synopsis(self, optparser):
        synopsis = optparser.get_usage()
        pgm=optparser.get_prog_name()                                    
        if synopsis:                                                           
            synopsis = synopsis.replace('Usage: %s '%pgm, '')                   
            return '.SH SYNOPSIS\n.B %s\n%s\n' % (self._markup(pgm),synopsis)
    def format_long_description(self, pgm, long_desc):
        long_desc = '\n'.join([line.lstrip()
                                for line in long_desc.splitlines()])
        long_desc = long_desc.replace('\n.\n', '\n\n')
        if long_desc.lower().startswith(pgm):
            long_desc = long_desc[len(pgm):]
        return '''.SH DESCRIPTION
.B %s 
%s
''' % (pgm, long_desc.strip())
         
    def format_tail(self, metadata, seealso=None):
        
        return ('.SH SEE ALSO\n%s\n'%seealso if seealso else '')+'''.SH COPYRIGHT 
%s %s

%s

.SH BUGS 
Please report bugs to the project\'s bug tracker at
.br
%s

.SH AUTHOR
%s (%s)
''' % (metadata['copyright'],metadata['author'],metadata['license'],metadata['bugtracker'],metadata['author'],metadata['author_contact'])


def generate_manpage(optparser,metadata,fileOut,seealso=None,section=1):
    """generate a man page from an optparse parser"""
    out=open(fileOut,'w')
    formatter=ManHelpFormatter()
    formatter.parser=optparser
    out.write(formatter.format_head(optparser,metadata,section))
    out.write(optparser.format_option_help(formatter))
    out.write(formatter.format_tail(metadata,seealso))

